package main

import "fmt"

func main() {
	// create() //创建示例
	// add() //切片中添加元素案例 ， 扩容规则还要再看看
	cp() //拷贝示例， 遍历元素拷贝，如果元素是引用类型，则是浅拷贝
}

/*
* 创建切片案例
 */
func create() {
	//数组
	array1 := [3]int{1, 2, 3}
	//值：[1 2 3] 类型: [3]int  长度：3  容量：3
	fmt.Printf("值：%v 类型: %T  长度：%v  容量：%v\n", array1, array1, len(array1), cap(array1))

	//切片
	slice1 := []int{1, 2, 3}
	//类型: []int  长度：3  容量：3
	fmt.Printf("值：%v 类型: %T  长度：%v  容量：%v\n", slice1, slice1, len(slice1), cap(slice1))

	//包左不包右, 底层与slice1公用一个数组
	slice2 := slice1[1:2]
	//值：[2] 类型: []int  长度：1  容量：2
	fmt.Printf("值：%v 类型: %T  长度：%v  容量：%v\n", slice2, slice2, len(slice2), cap(slice2))

	//make(类型, 长度, 容量)
	slice3 := make([]int, 4, 8)
	//值：[0 0 0 0] 类型: []int  长度：4  容量：8
	fmt.Printf("值：%v 类型: %T  长度：%v  容量：%v\n", slice3, slice3, len(slice3), cap(slice3))

	//指定下标
	slice4 := []int{1: 2, 3: 4}
	//值：[0 2 0 4] 类型: []int  长度：4  容量：4
	fmt.Printf("值：%v 类型: %T  长度：%v  容量：%v\n", slice4, slice4, len(slice4), cap(slice4))
}

/*
* 添加元素
 */
func add() {
	var slice []int
	for i := 0; i < 10; i++ {
		slice = append(slice, i)
		fmt.Printf("值：%v 类型: %T  长度：%v  容量：%v\n", slice, slice, len(slice), cap(slice))
	}

	slice1 := []int{1, 2}
	slice2 := []int{3, 4, 5}
	slice3 := append(slice1, slice2...)
	//值：[1 2] 类型: []int  长度：2  容量：2
	fmt.Printf("值：%v 类型: %T  长度：%v  容量：%v\n", slice1, slice1, len(slice1), cap(slice1))
	//值：[3 4 5] 类型: []int  长度：3  容量：3
	fmt.Printf("值：%v 类型: %T  长度：%v  容量：%v\n", slice2, slice2, len(slice2), cap(slice2))
	//值：[1 2 3 4 5] 类型: []int  长度：5  容量：6
	fmt.Printf("值：%v 类型: %T  长度：%v  容量：%v\n", slice3, slice3, len(slice3), cap(slice3))
}

/*
* 复制
*/
func cp() {
	s := []int{0, 1, 2, 3, 4}
	sCp := make([]int, len(s), len(s))
	copy(sCp, s)
	fmt.Printf("值：%v 类型: %T  长度：%v  容量：%v\n", sCp, sCp, len(sCp), cap(sCp))
}
